#!/bin/bash

# 确保使用bash执行
if [ -z "$BASH_VERSION" ]; then
    echo "=================================================="
    echo "❌ 错误: 此脚本需要bash支持"
    echo "=================================================="
    echo "请使用以下命令重新执行:"
    echo "  bash install_nginx.sh"
    echo "或者:"
    echo "  chmod +x install_nginx.sh && ./install_nginx.sh"
    echo "=================================================="
    exit 1
fi

# =============================================
# Nginx 一键安装脚本 (优化版)
# =============================================
# 功能特点：
# ✓ 支持多个nginx版本选择
# ✓ 自动安装常用功能模块
# ✓ 智能依赖检测和安装
# ✓ 详细的安装完成报告
# ✓ 中文界面友好提示
# =============================================

echo -e "\033[36m"
echo "=================================================="
echo "    🚀 Nginx 智能安装脚本 (简化优化版)"
echo "=================================================="
echo -e "\033[0m"
echo -e "\033[32m本脚本将为您安装包含以下功能的nginx：\033[0m"
echo -e "  • SSL/HTTPS支持"
echo -e "  • HTTP/2协议支持"  
echo -e "  • 四层代理(Stream)"
echo -e "  • 真实IP获取"
echo -e "  • 视频流支持(FLV/MP4)"
echo -e "  • WebDAV支持"
echo -e "  • 状态监控"
echo -e "  • 认证请求"
echo -e "  • 多线程和异步IO"
echo ""

# 获取最新版本以及往下的10个版本
get_latest_nginx_versions() {
    echo -e "\033[36m正在获取最新的nginx版本信息...\033[0m"
    
    # 尝试多种方式获取版本信息
    local versions_html=""
    
    # 方法1: 从nginx官网获取
    if command -v curl &> /dev/null; then
        echo -e "\033[36m尝试使用curl获取版本信息...\033[0m"
        versions_html=$(curl -s "https://nginx.org/download/" --connect-timeout 10 2>/dev/null)
    elif command -v wget &> /dev/null; then
        echo -e "\033[36m尝试使用wget获取版本信息...\033[0m"
        versions_html=$(wget -qO- "https://nginx.org/download/" --timeout=10 2>/dev/null)
    fi
    
    # 如果没有网络工具，直接使用预设版本
    if [ -z "$versions_html" ] && ! command -v curl &> /dev/null && ! command -v wget &> /dev/null; then
        echo -e "\033[33m警告: 未找到curl或wget，使用预设版本\033[0m"
        nginx_versions=("1.28.0" "1.27.3" "1.27.2" "1.27.1" "1.27.0" "1.26.2" "1.26.1" "1.26.0" "1.24.0" "1.22.1")
        return
    fi
    
    # 处理获取到的版本信息
    if [ -n "$versions_html" ] && [[ "$versions_html" == *"nginx-"* ]]; then
        echo -e "\033[32m✓ 成功获取nginx官网页面\033[0m"
        
        # 直接获取所有版本并按版本号倒序排列（不限制稳定版）
        nginx_versions=($(echo "$versions_html" | \
            grep -oP 'nginx-\K[0-9]+\.[0-9]+\.[0-9]+(?=\.tar\.gz)' | \
            sort -V -r | \
            uniq | \
            head -10))
        
        if [ ${#nginx_versions[@]} -gt 0 ]; then
            echo -e "\033[32m✓ 成功获取到 ${#nginx_versions[@]} 个最新版本\033[0m"
            echo -e "\033[36m版本列表: ${nginx_versions[*]}\033[0m"
        else
            echo -e "\033[33m未能解析版本信息，使用预设版本\033[0m"
            nginx_versions=("1.28.0" "1.27.3" "1.27.2" "1.27.1" "1.27.0" "1.26.2" "1.26.1" "1.26.0" "1.24.0" "1.22.1")
        fi
    else
        echo -e "\033[33m网络访问失败或页面异常，使用预设版本\033[0m"
        nginx_versions=("1.28.0" "1.27.3" "1.27.2" "1.27.1" "1.27.0" "1.26.2" "1.26.1" "1.26.0" "1.24.0" "1.22.1")
    fi
}

# 调用函数获取版本信息
get_latest_nginx_versions

while true; do
    echo -e "\n\033[33m===============================================\033[0m"
    echo -e "\033[33m           📥 选择Nginx版本            \033[0m"
    echo -e "\033[33m===============================================\033[0m"
    echo -e "\033[36m🔥 最新版本列表（包含1.27.x和1.28.x）：\033[0m"
    i=0
    for version in "${nginx_versions[@]}"; do
        i=$((i+1))
        if [ $i -eq 1 ]; then
            printf "  [%d] \033[32m%s\033[0m \033[33m(最新版 🚀)\033[0m\n" $i "$version"
        elif [ $i -le 3 ]; then
            printf "  [%d] \033[32m%s\033[0m \033[36m(新版本)\033[0m\n" $i "$version"
        else
            printf "  [%d] \033[36m%s\033[0m\n" $i "$version"
        fi
    done
    echo -e "  [\033[33mother\033[0m] 🔧 输入自定义版本号"
    echo ""

    read -p "👉 请输入您的选择（数字或other）：" choice

    # 检查用户输入是否为数字，且在有效范围内
    if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -le "${#nginx_versions[@]}" ]; then
        nginx_version=${nginx_versions[$(($choice-1))]}
        if [ $choice -eq 1 ]; then
            echo -e "\033[32m✓ 已选择最新版: nginx-${nginx_version} 🚀\033[0m"
        elif [ $choice -le 3 ]; then
            echo -e "\033[32m✓ 已选择新版本: nginx-${nginx_version} ✨\033[0m"
        else
            echo -e "\033[32m✓ 已选择版本: nginx-${nginx_version}\033[0m"
        fi
        break
    elif [[ "$choice" == "other" ]]; then
        echo -e "\n\033[36m🔧 自定义版本安装\033[0m"
        echo -e "\033[33m提示: 请确保输入的版本号在nginx官网存在\033[0m"
        echo -e "\033[33m参考格式: 1.24.0, 1.25.1, 1.26.0\033[0m"
        read -p "👉 请输入nginx版本号: " custom_version
        if [[ $custom_version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            nginx_version=$custom_version
            echo -e "\033[32m✓ 已选择自定义版本: nginx-${nginx_version}\033[0m"
            break
        else
            echo -e "\033[31m❌ 版本号格式错误，请使用 x.y.z 格式\033[0m"
        fi
    else
        echo -e "\033[31m无效的选择，请输入有效的数字或other\033[0m"
    fi
done

# 构建Nginx下载链接
download_url="https://nginx.org/download/nginx-${nginx_version}.tar.gz"

echo -e "\n\033[36m===============================================\033[0m"
echo -e "\033[36m           📦 开始下载nginx源码           \033[0m"
echo -e "\033[36m===============================================\033[0m"
echo -e "\033[33m版本: nginx-${nginx_version}\033[0m"
echo -e "\033[33m下载链接: ${download_url}\033[0m"
echo ""

# 下载Nginx源码包
if wget "$download_url"; then
    echo -e "\033[32m✓ nginx-${nginx_version}.tar.gz 下载完成\033[0m"
else
    echo -e "\033[31m❌ 下载失败，请检查网络连接或版本号是否正确\033[0m"
    echo -e "\033[33m💡 建议: 检查版本号格式或尝试其他版本\033[0m"
    exit 1
fi

# 检查下载的文件是否存在
if [ -f "nginx-${nginx_version}.tar.gz" ]; then
    echo -e "\033[32mNginx源码包文件nginx-${nginx_version}.tar.gz已成功下载。\033[0m"
else
    echo -e "\033[31m下载的Nginx源码包文件不存在，请检查版本号和网络状况。\033[0m"
    exit 1
fi

# 记录当前工作目录
original_dir=$(pwd)

# 解压目录
echo "请输入解压目录（默认：/tmp）："
read extract_dir
extract_dir=${extract_dir:-/tmp}

# 创建解压目录（如果不存在）
mkdir -p "$extract_dir"

# 使用绝对路径解压
tar -zxvf "$original_dir/nginx-${nginx_version}.tar.gz" -C "$extract_dir"

# 进入解压后的目录
cd "$extract_dir/nginx-${nginx_version}" || {
    echo -e "\033[31m❌ 无法进入解压目录，安装失败\033[0m"
    exit 1
}

# 提示输入Nginx运行用户和组名
echo "请输入Nginx运行用户（默认nginx）:"
read nginx_user
nginx_user=${nginx_user:-nginx}

echo "请输入Nginx运行组名（默认nginx）:"
read nginx_group
nginx_group=${nginx_group:-nginx}

# 创建Nginx运行用户和组
id -u $nginx_user &>/dev/null || useradd -s /sbin/nologin -r $nginx_user
getent group $nginx_group &>/dev/null || groupadd $nginx_group
usermod -a -G $nginx_group $nginx_user

# 提示输入Nginx安装目录
echo "请输入Nginx安装目录（默认：/opt/nginx）:"
read install_dir
install_dir=${install_dir:-/opt/nginx}

# 创建安装目录，并赋予Nginx运行用户所有权
mkdir -p "$install_dir"
chown -R $nginx_user:$nginx_group "$install_dir"

# 智能检查并安装Nginx依赖包
echo -e "\033[36m正在检查并安装Nginx编译所需的依赖包...\033[0m"

# 检测系统类型
if [ -f /etc/redhat-release ]; then
    # RedHat/CentOS系统
    echo -e "\033[33m检测到RedHat/CentOS系统\033[0m"
    sudo yum update -y
    sudo yum install -y \
        pcre-devel \
        zlib-devel \
        openssl-devel \
        gcc \
        gcc-c++ \
        autoconf \
        automake \
        make \
        wget
elif [ -f /etc/debian_version ]; then
    # Debian/Ubuntu系统
    echo -e "\033[33m检测到Debian/Ubuntu系统\033[0m"
    sudo apt-get update
    sudo apt-get install -y \
        libpcre3-dev \
        zlib1g-dev \
        libssl-dev \
        gcc \
        g++ \
        autoconf \
        automake \
        make \
        wget \
        build-essential
else
    echo -e "\033[33m未能自动识别系统类型，请手动安装以下依赖：\033[0m"
    echo "  • pcre开发库"
    echo "  • zlib开发库" 
    echo "  • openssl开发库"
    echo "  • gcc编译器"
    echo "  • make工具"
    echo "  • wget下载工具"
fi 

# =============================================
# 开始编译和安装Nginx
# =============================================

echo -e "\n\033[36m===============================================\033[0m"
echo -e "\033[36m           🔧 开始配置和编译Nginx           \033[0m"
echo -e "\033[36m===============================================\033[0m"

# 创建必要的目录
mkdir -p $install_dir/logs
mkdir -p $install_dir/conf/conf.d
mkdir -p $install_dir/html

# 配置编译选项
echo -e "\033[36m正在配置编译选项...\033[0m"

# 执行配置
./configure \
    --prefix=$install_dir \
    --user=$nginx_user \
    --group=$nginx_group \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_stub_status_module \
    --with-http_gzip_static_module \
    --with-http_sub_module \
    --with-http_flv_module \
    --with-http_mp4_module \
    --with-stream \
    --with-stream_ssl_module \
    --with-threads \
    --with-file-aio \
    --with-http_dav_module \
    --with-http_auth_request_module \
    --with-http_addition_module \
    --with-http_slice_module \
    --with-http_gunzip_module

if [ $? -ne 0 ]; then
    echo -e "\033[31m❌ 配置失败，请检查错误信息\033[0m"
    exit 1
fi

# 编译
echo -e "\033[36m正在编译Nginx...\033[0m"
make -j$(nproc)

if [ $? -ne 0 ]; then
    echo -e "\033[31m❌ 编译失败，请检查错误信息\033[0m"
    exit 1
fi

# 安装
echo -e "\033[36m正在安装Nginx...\033[0m"
make install

if [ $? -ne 0 ]; then
    echo -e "\033[31m❌ 安装失败，请检查错误信息\033[0m"
    exit 1
fi

# 创建systemd服务文件
echo -e "\033[36m正在创建systemd服务文件...\033[0m"
cat > /etc/systemd/system/nginx.service << EOL
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=$install_dir/logs/nginx.pid
ExecStartPre=$install_dir/sbin/nginx -t
ExecStart=$install_dir/sbin/nginx
ExecReload=$install_dir/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOL

# 重新加载systemd配置
systemctl daemon-reload

# 设置开机自启
systemctl enable nginx

# 创建快捷命令
echo -e "\033[36m正在创建快捷命令...\033[0m"
ln -sf $install_dir/sbin/nginx /usr/bin/nginx

# 打印安装完成信息
echo -e "\n\033[32m===============================================\033[0m"
echo -e "\033[32m           ✅ Nginx 安装成功!            \033[0m"
echo -e "\033[32m===============================================\033[0m"
echo -e "\033[36m安装信息：\033[0m"
echo -e "  • 版本: \033[33mnginx-${nginx_version}\033[0m"
echo -e "  • 安装路径: \033[33m${install_dir}\033[0m"
echo -e "  • 配置文件: \033[33m${install_dir}/conf/nginx.conf\033[0m"
echo -e "  • 扩展配置目录: \033[33m${install_dir}/conf/conf.d\033[0m"
echo -e "  • 主程序: \033[33m${install_dir}/sbin/nginx\033[0m"
echo -e "  • 运行用户: \033[33m${nginx_user}\033[0m"
echo -e "\n\033[36m常用命令：\033[0m"
echo -e "  • 启动: \033[33msystemctl start nginx\033[0m"
echo -e "  • 停止: \033[33msystemctl stop nginx\033[0m"
echo -e "  • 重启: \033[33msystemctl restart nginx\033[0m"
echo -e "  • 重载配置: \033[33msystemctl reload nginx\033[0m"
echo -e "  • 查看状态: \033[33msystemctl status nginx\033[0m"
echo -e "  • 检查配置: \033[33mnginx -t\033[0m"
echo -e "\n\033[32m感谢使用此安装脚本！\033[0m"

# 返回到原始目录
cd "$original_dir"

# 询问是否启动Nginx
echo -e "\n\033[33m是否立即启动Nginx服务？(y/n)\033[0m"
read start_nginx

if [[ "$start_nginx" =~ ^[Yy]$ ]]; then
    systemctl start nginx
    if [ $? -eq 0 ]; then
        echo -e "\033[32m✓ Nginx服务已成功启动\033[0m"
        
        # 获取本机IP地址
        ip_addr=$(ip addr | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d/ -f1 | head -n 1)
        if [ -n "$ip_addr" ]; then
            echo -e "\033[36m您可以通过以下地址访问Nginx：\033[0m"
            echo -e "\033[33mhttp://${ip_addr}/\033[0m"
        fi
    else
        echo -e "\033[31m❌ Nginx服务启动失败，请检查错误信息\033[0m"
    fi
else
    echo -e "\033[33m您可以稍后手动启动Nginx服务\033[0m"
fi 